package com.dragoncombin.homework.Module04.Problem03;

import java.io.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CopyDirectoryTest extends Thread{

    // 实现将一个目录中的所有内容拷贝到另外一个目录
    @Override
    public void run() {

        // 1. 提示用户输入需要拷贝的目录和拷贝到的目标目录
        Scanner in = new Scanner(System.in);
        System.out.print("请输入需要拷贝的目录: ");
        String fromStr = in.next();
        System.out.print("请输入目标目录: ");
        String toStr = in.next();

        // 2. 就原目录和目标目录分别创建File类型的对象
        File fromCopy = new File(fromStr);
        File toCopy = new File(toStr);
        //3. 判断toCopy是否存在，不存在就创建
        if (!toCopy.exists()) {
            boolean b1 = toCopy.mkdir();
            System.out.println("创建" + toCopy.getName() + "目录" + (b1 ? "成功": "失败"));
        }
        // 4. 调用copy方法，将一个目录中的所有内容拷贝到另一个目录
        try {
            copy(fromCopy, toCopy);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 实现将from目录中的所有内容拷贝到to目录下
    private void copy(File from, File to) throws IOException {
        File[] fromFiles = from.listFiles();
        for (File file : fromFiles) {
            File toFile = new File(to, file.getName());
            if (file.isFile()) {
                // 使用文件输入和输出流进行文件的拷贝
                boolean b1 = toFile.createNewFile();
                System.out.println("新建 " + toFile.getName() + " 文件" + (b1 ? "成功": "失败"));
                copyFile(file, toFile);
            } else {
                boolean b2 = toFile.mkdir();
                System.out.println("--创建目录 " + toFile.getName() + (b2 ? "成功": "失败"));
                copy(file, toFile);
            }
        }
    }

    // 实现拷贝单个文件
    private void copyFile(File from, File to) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(from));
            bos = new BufferedOutputStream(new FileOutputStream(to));

            // 读取文件内容
            byte[] bArr = new byte[1024];
            int cnt = 0;
            while (-1 != (cnt = bis.read(bArr))) {
                bos.write(bArr, 0, cnt);
            }
            System.out.println(from.getName() + "文件拷贝成功...");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭输入输出流
            if (null != bos) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        /*
           编程题
            使用线程池将一个目录中的所有内容拷贝到另外一个目录中，包含子目录中的内容。
         */

        // 1. 创建CopyDirectoryTest类型的对象
        CopyDirectoryTest cdt = new CopyDirectoryTest();

        // 2. 创建具有固定线程数的线程池
        ExecutorService es = Executors.newFixedThreadPool(5);

        // 3. 使用ExecutorService类型的对象执行线程
        es.execute(cdt);

        // 4. 关闭线程池并释放资源
        es.shutdown();
    }
}
